package com.code;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;

/**
 * @Author fanxin
 * @Date: 2024/5/25 22:29
 * @Version 1.0
 */
public class Solution {

    /**
     * @param nums
     * @return
     */
    public int thirdMax(int[] nums) {
        HashSet<Integer> set = new HashSet<>();
        for (int num : nums) {
            set.add(num);
        }
        ArrayList<Integer> integers = new ArrayList<>(set);
        Collections.sort(integers);
        if (integers.size() < 3) return integers.get(integers.size() - 1);
        else return integers.get(integers.size() - 3);
    }

    public static void main(String[] args) {
        int[] arr = {-710, -107, -851, 657, -14, -859, 278, -182, -749, 718, -640, 127, -930, -462, 694, 969, 143, 309, 904, -651, 160, 451, -159, -316, 844, -60, 611, -169, -73, 721, -902, 338, -20, -890, -819, -644, 107, 404, 150, -219, 459, -324, -385, -118, -307, 993, 202, -147, 62, -94, -976, -329, 689, 870, 532, -686, 371, -850, -186, 87, 878, 989, -822, -350, -948, -412, 161, -88, -509, 836, -207, -60, 771, 516, -287, -366, -512, 509, 904, -459, 683, -563, -766, -837, -333, 93, 893, 303, 908, 532, -206, 990, 280, 826, -13, 115, -732, 525, -939, -787};
        int b = new Solution().maximumProduct(arr);
        System.out.println("max = " + b);
    }


    public int findUnsortedSubarray(int[] nums) {
        // 从左到右确定最大值 从右到左确定最小值
        int len = nums.length;
        int max = nums[0];
        int min = nums[len - 1];
        int begin = 0, end = 0;
        for (int i = 0; i < nums.length; i++) {
            // 左边更新最大值
            if (nums[i] >= max) {
                max = nums[i];
            } else {
                begin = i;
            }

            // 右边更新最小值
            if (nums[len - 1 - i] <= min) {
                min = nums[len - 1 - i];
            } else {
                end = len - 1 - i;
            }
        }
        return end < begin ? begin - end + 1 : 0;
    }


    /**
     * 605. 种花问题
     * 简单
     * 假设有一个很长的花坛，一部分地块种植了花，另一部分却没有。可是，花不能种植在相邻的地块上，它们会争夺水源，两者都会死去。
     * 给你一个整数数组 flowerbed 表示花坛，由若干 0 和 1 组成，其中 0 表示没种植花，1 表示种植了花。另有一个数 n ，能否在不打破种植规则的情况下种入 n 朵花？
     * 能则返回 true ，不能则返回 false 。
     */
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        // 初始化树的数量 0

        if (flowerbed.length == 1 && flowerbed[0] == 0) {
            return 1 >= n;
        }

        int count = 0;
        if (flowerbed[0] == 0 && flowerbed[1] == 0) {
            flowerbed[0] = 1;
            count++;
        }
        for (int i = 1; i < flowerbed.length - 1; i++) {
            if (flowerbed[i] == 0 && flowerbed[i - 1] == 0 && flowerbed[i + 1] == 0) {
                flowerbed[i] = 1;
                count++;
            }
        }
        if (flowerbed[flowerbed.length - 1] == 0 && flowerbed[flowerbed.length - 2] == 0) {
            flowerbed[flowerbed.length - 1] = 1;
            count++;
        }
        if (count >= n) return true;
        else return false;
    }


    /**
     * 三个数的最大乘积
     * 给你一个整型数组 nums ，在数组中找出由三个数组成的最大乘积，并输出这个乘积
     */
    public int maximumProduct(int[] nums) {
        Arrays.sort(nums);
        // 全是正数
        int len = nums.length;
        if (nums[0] >= 0) {
            return nums[len - 1] * nums[len - 2] * nums[len - 3];
        } else if (nums[len - 1] < 0) {
            // 全是负数
            return nums[len - 3] * nums[len - 2] * nums[len - 1];
        } else if (nums[1] < 0 && nums[2] >= 0) {
            // 一负多负
            // -10 -8 -7 -3 -4 -5 -6
            return nums[0] * nums[1] * nums[len - 1];
        } else {
            return Math.max(nums[0] * nums[1] * nums[len - 1], nums[len - 3] * nums[len - 2] * nums[len - 1]);
        }
    }


}
